package com.syh.jn.scm.domain.supplier.entity.base;

import cn.redscarf.commons.util.bean.ExtBeanUtils;
import cn.redscarf.commons.spring.SpringContextUtils;
import com.syh.jn.scm.domain.supplier.repository.base.ProjectReadRepository;
import com.syh.jn.scm.domain.support.SuperBusinessAggregate;
import com.syh.jn.scm.dto.supplier.base.project.ProjectItemSto;
import com.syh.jn.scm.exception.BusinessException;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

import java.util.UUID;

/**
 * 运营项目关联商品管理
 */
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
public class ProjectItem extends SuperBusinessAggregate<Long> {

  /**
   * 初始化构造，关联商品
   *
   * @param sto
   * @return
   */
  public ProjectItem(ProjectItemSto sto) {
    //TODO 可以通过前端控制用户不能操作停用的运营项目关联商品操作，后续待定
    ExtBeanUtils.copyProperties(sto, this);

    //判断是否选中运营项目
    if (this.projectId == null) {
      logger.error("modify:所选运营项目ID为空,不可以关联");
      throw new BusinessException("所选运营项目ID为空,不可以关联");
    }

    //项目停用则报错
    this.projectStop();
    this.uuid = UUID.randomUUID().toString();
  }

  /**
   * 取消关联商品
   *
   * @param id
   */
  public void cancelRelationItem(Long id) {
    //TODO 可以通过前端控制用户不能操作停用的运营项目关联商品操作，后续待定
    //判断运营项目ID是否为空
    if (this.projectId == null) {
      logger.error("modify:所选运营项目ID为空,不可以取消关联");
      throw new BusinessException("所选运营项目ID为空,不可以取消关联");
    }

    //项目停用则报错
    this.projectStop();
  }

  /**
   * 禁止停用运营项目操作关联商品功能
   */
  private void projectStop() {
    //查找当前运营项目
    ProjectReadRepository projectReadRepository = (ProjectReadRepository) SpringContextUtils.getBean("projectRepositoryImpl");
    Project project = projectReadRepository.getById(this.projectId);
    //判断是否停用
    if (!Short.valueOf("1").equals(project.getStatus())) {
      logger.error("modify:当前运营项目已停用,不可以取消关联或关联商品");
      throw new BusinessException("当前运营项目已停用,不可以取消关联或关联商品");
    }
  }

  /**
   * 运营项目id
   */
  private Long projectId;
  /**
   * 商品id
   */
  private Long goodsId;
  /**
   * 商品编码
   */
  private String goodsCode;
  /**
   * 商品名称
   */
  private String goodsName;
  /**
   * 分类id
   */
  private Long categoryId;
  /**
   * 计量单位
   */
  private String units;
}
